//public class SyncDemo {
//    // 普通同步方法，锁是当前实例对象（this）
//    public synchronized void test() {
//        // 临界区代码
//        try {
//            Thread.sleep(1000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        System.out.println(Thread.currentThread().getName() + "执行完毕");
//    }
//
//    public static void main(String[] args) {
//        SyncDemo obj1 = new SyncDemo();
//        SyncDemo obj2 = new SyncDemo();
//
//        // 线程1访问 obj1 的普通同步方法
//        new Thread(() -> obj1.test(), "线程1").start();
//        // 线程2访问 obj2 的普通同步方法（锁对象不同，可同时执行）
//        new Thread(() -> obj2.test(), "线程2").start();
//    }
//}
public class SyncDemo {
    //
    // 静态同步方法，锁是 SyncDemo.class
    public static synchronized void test() {
        // 临界区代码
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "执行完毕");
    }

    public static void main(String[] args) {
        SyncDemo obj1 = new SyncDemo();
        SyncDemo obj2 = new SyncDemo();

        // 线程1访问静态同步方法（锁是 SyncDemo.class）
        new Thread(() -> obj1.test(), "线程1").start();
        // 线程2访问静态同步方法（锁是同一个 Class 对象，需等待线程1释放）
        new Thread(() -> obj2.test(), "线程2").start();
    }
}